package com.tencent.service;

import java.io.IOException;
import java.util.Date;

import com.tencent.common.HttpRequest;
import com.tencent.protocol.simple_protocol.SimpleProtol;
import com.zkingsoft.plugin.util.LogUtil;

import net.sf.json.JSONObject;

/**
 * 
 * @Description: 通用服务接口
 * @author:姜友瑶
 * @date 2016年10月14日
 */
public class CommonService {

	/**
	 * access_token是公众号的全局唯一接口调用凭据，公众号调用各接口时都需使用access_token。
	 */
	private static String access_token;

	/**
	 * 凭证有效时间失效时间为2个小时
	 */
	private static int expire_in = 2 * 60 * 60;;

	/**
	 * 凭证上次刷新时间
	 */
	private static Date token_freshen_time = null;

	/**
	 * jsapi_ticket上次刷新时间
	 */
	private static Date jsapi_ticket_freshen_time = null;

	/**
	 * jsapi_ticket是公众号用于调用微信JS接口的临时票据
	 */
	private static String jsapi_ticket;

	/**
	 * 
	 * @Description: 获取微信access_token
	 * @author:姜友瑶
	 * @return 返回类型 String
	 * @date 2016年10月14日
	 */
	public static String getAccessToken1() {
		if (token_freshen_time != null) {
			// 重新获取token
			long longTime = (new Date().getTime() - token_freshen_time.getTime()) / 1000;
			// 失效前200秒刷新token
			if (expire_in - longTime < 200) {
				freshenAccessToken();
			}
			LogUtil.info(CommonService.class, "freshen wexin access_token");
		} else {
			// 第一次请求token
			LogUtil.info(CommonService.class, "get weixin access_token");
			freshenAccessToken();

		}
		return access_token;

	}

	/**
	 * 
	 * @Description: 刷新微信token
	 * @author:姜友瑶 返回类型 void
	 * @date 2016年10月14日
	 */
	private static void freshenAccessToken() {
		try {
			String url = SimpleProtol.getAccess_tokenApi();

			LogUtil.info(CommonService.class, "request freshenAccessToken url= " + url);

			String result = HttpRequest.createHttpRequest().sendHttpGet(url, null).getDataString();

			LogUtil.info(CommonService.class, "request freshenAccessToken responseDate= " + result);

			JSONObject json = JSONObject.fromObject(result);
			access_token = (String) json.get("access_token");
			// 失效时间为2个小时
			expire_in = 2 * 60 * 60;
			token_freshen_time = new Date();
		} catch (IOException e) {
			LogUtil.warn(CommonService.class, "freshen wexin access_token Fall ");
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @Description: 根据授权返回的code查询用户信息
	 * @author:姜友瑶 返回类型 void
	 * @date 2016年10月14日
	 */
	public static JSONObject getWXUserInfo(String code) {
		try {
			// 获取授权token
			String token_url = SimpleProtol.getOAUTH2AccessToken(code);
			String token_result = HttpRequest.createHttpRequest().sendHttpGet(token_url, null).getDataString();
			JSONObject token_json = JSONObject.fromObject(token_result);
			String access_token = (String) token_json.get("access_token");
			String openid = (String) token_json.get("openid");

			// 获取用户信息
			String userinfo_url = SimpleProtol.getOAUTH2UserInfo(access_token, openid);
			String userinfo_result = HttpRequest.createHttpRequest().sendHttpGet(userinfo_url, null).getDataString();
			JSONObject json = JSONObject.fromObject(userinfo_result);
			return json;
		} catch (IOException e) {
			LogUtil.warn(CommonService.class, "getWXUserInfo  Fall ");
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 
	 * @Description: 获取微信Jsapi_ticket
	 * @author:姜友瑶
	 * @return 返回类型 String
	 * @date 2016年10月14日
	 */
	public static String getJsapiTicket() {
		if (jsapi_ticket_freshen_time != null) {
			long longTime = (new Date().getTime() - jsapi_ticket_freshen_time.getTime()) / 1000;
			// 失效前200秒刷新freshenJsapiTicket
			if (expire_in - longTime < 200) {
				freshenJsapiTicket();
			}
			LogUtil.info(CommonService.class, "freshen wexin freshenJsapiTicket");
		} else {
			// 第一次请求freshenJsapiTicket
			LogUtil.info(CommonService.class, "get weixin freshenJsapiTicket");
			freshenJsapiTicket();
		}
		return jsapi_ticket;

	}

	/**
	 * 
	 * @Description: 刷新微信JsapiTicket
	 * @author:姜友瑶 返回类型 void
	 * @date 2016年10月14日
	 */
	private static void freshenJsapiTicket() {
		try {
			String access_toke = getAccessToken1();
			String url = SimpleProtol.getJsapiTicket(access_toke);
			LogUtil.info(CommonService.class, "request freshenJsapiTicket url= " + url);
			String result = HttpRequest.createHttpRequest().sendHttpGet(url, null).getDataString();
			LogUtil.info(CommonService.class, "request freshenJsapiTicket responseDate= " + result);
			JSONObject json = JSONObject.fromObject(result);
			jsapi_ticket = (String) json.get("ticket");
			jsapi_ticket_freshen_time = new Date();
		} catch (IOException e) {
			LogUtil.warn(CommonService.class, "freshen wexin freshenJsapiTicket Fall ");
			e.printStackTrace();
		}
	}
}
